iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

Go in 3o系列 第 21

[Day21] - Go in 30 - 介面 - 型別斷言(type assertion)

  • 分享至 

  • xImage
  •  

一、本篇提要

  • 型別斷言(type assertion)
  • 斷言與switch

二、型別斷言

在 Golang 中,所有型別都實現了 interface{} 這個介面。因此,無論是基本型別(如 string, int)還是自定義型別,都可以被當作 interface{} 進行操作。

當一個值作為 interface{} 類型傳入時,需要進行型別斷言才能恢復其原始型別。

func funcName(a interface{}) string {
    return string(a) // 會出錯,需要型別斷言
}
  1. 型別斷言的方法:
    直接斷言使用:如果斷言失敗,會引起 panic。
var a interface{}
fmt.Println("Hi, I am ", a.(string))
  1. 因此,我們須事先透過 ok 進行安全斷言:此方法可以安全的進行斷言,避免 panic。

從介面值中提取指定的型別。

語法:

value.(typeName)。

"comma, ok" idiom

語法:

str, ok := value.(string)。

範例 :

value, ok := a.(string)
if !ok {
    fmt.Println("It's not ok for type string")
    return
}
fmt.Println("The value is ", value)

value, ok := a.(string) 這種語法中的 ok 是固定的用法,但並不是說只能使用 ok 這個名稱。
這裡的 ok 是一個慣例用法,表示型別斷言是否成功。

這種語法會回傳兩個值:

  • 第一個值(在此例中是 value)是型別斷言的結果。

  • 第二個值(在此例中是 ok)是一個布林值,表示斷言是否成功。如果成功,ok 會是 true,並且 value 會是被斷言的值。如果斷言失敗,ok 會是 false,且 value 會是那個型別的零值。
    你可以使用其他的變數名稱替代 ok,例如:

  1. 使用 switch 進行多種型別斷言:可以檢查多種可能的型別。

三、使用 switch 進行多型別斷言

範例

package main

import (
	"fmt"
)

func main() {
	var i interface{}

	// 讓 i = 42, 它是 int 型別
	i = 42
	checkType(i)

	// 讓 i = "hello", 它是 string 型別
	i = "hello"
	checkType(i)

	// 讓 i = true, 它是 bool 型別
	i = true
	checkType(i)
}

func checkType(t interface{}) {
	switch v := t.(type) {
	case int:
        fmt.Printf("%v is an int\n", v)
	case string:
		fmt.Printf("%v is a string\n", v)
	case bool:
		fmt.Printf("%v is a bool\n", v)
	default:
		fmt.Printf("The type of %v is %T\n", v, v)
	}
}

以上就是有關型別斷言~


上一篇
[Day20] Go in 30 - 介面 - 泛型(generic)
下一篇
[Day22] - Go in 30 - 泛型(generic)
系列文
Go in 3o30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言